package com.munhrasoft.dinamica.managedbeans;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.TabChangeEvent;

import com.munhrasoft.dinamica.business.entities.Cliente;
import com.munhrasoft.dinamica.business.entities.Imovel;
import com.munhrasoft.dinamica.business.logic.ClienteEJB;

@ManagedBean
@ViewScoped
public class ClienteController {

    /*
     * Acho que nao vai precisar de ficar inicializando direto os objetos como no exemplo do
     * tabchanged, acho que quem anulava o objeto de pesquisa era o datatable
     */

    private static Logger logger         = Logger.getLogger(ClienteController.class.getName());

    @EJB
    private ClienteEJB    clienteEJB;

    private Cliente       cliente        = new Cliente();
    private Cliente       pesqcliente    = new Cliente();
    private Cliente       rescliente     = new Cliente();
    private Imovel        selectedImovel = new Imovel();
    private List<Cliente> clienteList    = new ArrayList<Cliente>();

    @PostConstruct
    public void init() {
        logger.info("PostConstruct");
        clienteList = clienteEJB.fetchAllClientes();
        pesqcliente = new Cliente();
        cliente = new Cliente();
        rescliente = new Cliente();
    }

    public void createCliente(ActionEvent actionEvent) {

        // um cliente sempre tera que ter um imovel, portanto vamos
        // criar um imovel fake so para nao ficar vazio e
        // depois este imovel será preenchido e outros poderao
        // ser adicionados
        
        Imovel imovelVazio = new Imovel();

        imovelVazio.setEndereco("VAZIO");
        imovelVazio.setFundogarantia(0.0);
        imovelVazio.setGaragem(false);
        imovelVazio.setMatricula("VAZIO");
        imovelVazio.setRecursosprop(0.0);
        imovelVazio.setValcompvendaapto(0.0);
        imovelVazio.setValcompvendatotal(0.0);
        imovelVazio.setValoraval(0.0);
        imovelVazio.setValorcompvendagaragem(0.0);
        imovelVazio.setValorfinanc(0.0);

        List<Imovel> ListaImoveis = new ArrayList<Imovel>();
        ListaImoveis.add(imovelVazio);
        
        cliente.setImoveis(ListaImoveis);
        
        
        cliente = clienteEJB.createCliente(cliente);
        cliente = new Cliente();
        
        pesqcliente = new Cliente();
        showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída", "Cliente criado com sucesso");
    }

    public void pegarTodosClientes(ActionEvent actionEvent) {
        clienteList = clienteEJB.fetchAllClientes();

        if (!clienteList.isEmpty()) {
            pesqcliente = clienteList.get(0);
        } else {
            // TODO escreve uma mensagem de warning falando que a busca n�o
            // retornou nada.
        }

    }

    public void adicionaImovel(ActionEvent actionEvent) {
        logger.info("Adiciona imovel");
        rescliente.getImoveis().add(new Imovel());
        showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída",
                "Imovel adicionado com sucesso");

    }

    public void removeImovel(ActionEvent actionEvent) {
        logger.info("Remove imovel");
        if (selectedImovel != null) {
            rescliente.getImoveis().remove(selectedImovel);
        } else {
            showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída",
                    "Imovel removido com sucesso");

        }
    }

    public void saveCliente(ActionEvent actionEvent) {
        pesqcliente = clienteEJB.updateCliente(pesqcliente);
        if (pesqcliente != null) {
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Cliente atualizado com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Erro", "O Cliente nãoo foi atualizado");
        }
    }

    public void removeCliente(ActionEvent actionEvent) {
        if (pesqcliente != null) {
            clienteEJB.removeCliente(pesqcliente);
            clienteList = clienteEJB.fetchAllClientes();
            pesqcliente = new Cliente();
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Cliente removido com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Operação falhou", "Cliente não selecionado");
        }

    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public List<Cliente> getClienteList() {
        return clienteList;
    }

    public void setClienteList(List<Cliente> clienteList) {
        this.clienteList = clienteList;
    }

    public Cliente getPesqcliente() {
        return pesqcliente;
    }

    public void setPesqcliente(Cliente pesqcliente) {
        this.pesqcliente = pesqcliente;
    }

    public Cliente getRescliente() {
        return rescliente;
    }

    public void setRescliente(Cliente rescliente) {
        this.rescliente = rescliente;
    }

    public Imovel getSelectedImovel() {
        return selectedImovel;
    }

    public void setSelectedImovel(Imovel selectedImovel) {
        this.selectedImovel = selectedImovel;
    }

    public void rowSelect(SelectEvent event) {
        logger.info("Row select");
        pesqcliente = rescliente;

    }

    public void changeTabView(TabChangeEvent event) {
        logger.info("Tabview changed " + event.getTab().getId());
        clienteList = clienteEJB.fetchAllClientes();
        pesqcliente = new Cliente();
        cliente = new Cliente();
    }

    private void showMessage(Severity sev, String summary, String detail) {
        FacesMessage message = new FacesMessage(sev, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

}
